package juanca.mole;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Calendar;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;

import ClasesExtras.AdaptadorIngredientesProducto;
import ClasesExtras.AdaptadorListaMaquinas;
import ClasesExtras.GetIpAddress;
import ClasesExtras.IngredientesProducto;
import ClasesExtras.ManejadorCampos;
import ClasesExtras.Maquinas;
import ClasesExtras.ValidacionCampos;
import ClasesExtras.handlerAlertMessage;
import ClasesExtras.handlerDb;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.savagelook.android.JsonHelper;

public class Trazabilidad extends Activity {

	private int fAno;
	private int fMes;
	private int fDia;
	private String fechaElabora;
	private String fechaVenc;
	private String EstadoFinalProceso;
	private String maquina;
	private String idMaquina;
	private String obs;

	private double tempFinal;
	private String matrizIMP[][];
	private int tipo;

	public ValidacionCampos validarcampos = new ValidacionCampos();
	public ProgressDialog progressDialog;
	public String dateElabora;
	public String dateVenc;
	public static final int DATE_DIALOG_ID1 = 0;
	public static final int DATE_DIALOG_ID2 = 1;
	private String URL_IMP;
	private String URL_MAQUINAS;
	private String URL_CONTROLES_FRUVER;
	private String URL_FIN_PROCESO;
	private String URL_REGISTRO_MAQUINAS_PROCESO;

	private TextView tvVacio;
	private EditText etTempFinalProceso;
	private EditText etObsTraza;
	private ListView lvIMP;
	private ListView lvMaqUsada;
	private Button btnRegFinTraza;
	private ManejadorCampos manejador;
	private handlerAlertMessage manejadorMensajes;
	private Activity activity;
	private ArrayList<IngredientesProducto> Lista_MpInspec;
	private AdaptadorIngredientesProducto adaptador;
	public Trazabilidad self = this;
	public handlerDb handlerdb = new handlerDb(this);
	public JSONArray JsonArrayIMP;
	public JSONArray JsonArrayCtrlFV;
	public String idRegistro;
	public String nombreLote;
	ArrayList<Maquinas> listMaquinas;
	AdaptadorListaMaquinas adaptadorMaq;

	/**
	 * @return the tipo
	 */
	public int getTipo() {
		return tipo;
	}

	/**
	 * @param tipo
	 *            the tipo to set
	 */
	public void setTipo(int tipo) {
		this.tipo = tipo;
	}

	/**
	 * @return the lista_MpInspec
	 */
	public ArrayList<IngredientesProducto> getLista_MpInspec() {
		return Lista_MpInspec;
	}

	/**
	 * @param lista_MpInspec
	 *            the lista_MpInspec to set
	 */
	public void setLista_MpInspec(ArrayList<IngredientesProducto> lista_MpInspec) {
		Lista_MpInspec = lista_MpInspec;
	}

	/**
	 * @return the tempFinal
	 */
	public double getTempFinal() {
		return tempFinal;
	}

	/**
	 * @param tempFinal
	 *            the tempFinal to set
	 */
	public void setTempFinal(double tempFinal) {
		this.tempFinal = tempFinal;
	}

	/**
	 * @return the obs
	 */
	public String getObs() {
		return obs;
	}

	/**
	 * @param obs
	 *            the obs to set
	 */
	public void setObs(String obs) {
		this.obs = obs;
	}

	/**
	 * @return the maquina
	 */
	public String getMaquina() {
		return maquina;
	}

	/**
	 * @param maquina
	 *            the maquina to set
	 */
	public void setMaquina(String maquina) {
		this.maquina = maquina;
	}

	/**
	 * @return the idMaquina
	 */
	public String getIdMaquina() {
		return idMaquina;
	}

	/**
	 * @param idMaquina
	 *            the idMaquina to set
	 */
	public void setIdMaquina(String idMaquina) {
		this.idMaquina = idMaquina;
	}

	/**
	 * @return the fechaVenc
	 */
	public String getFechaVenc() {
		return fechaVenc;
	}

	/**
	 * @param fechaVenc
	 *            the fechaVenc to set
	 */
	public void setFechaVenc(String fechaVenc) {
		this.fechaVenc = fechaVenc;
	}

	/**
	 * @return the fechaElabora
	 */
	public String getFechaElabora() {
		return fechaElabora;
	}

	/**
	 * @param fechaElabora
	 *            the fechaElabora to set
	 */
	public void setFechaElabora(String fechaElabora) {
		this.fechaElabora = fechaElabora;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_trazabilidad);

		getWindow().setSoftInputMode(
				WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

		tvVacio = (TextView) findViewById(R.id.tvVacio);
		etTempFinalProceso = (EditText) findViewById(R.id.etTempFinalProceso);
		etObsTraza = (EditText) findViewById(R.id.etObsTraza);
		lvIMP = (ListView) findViewById(R.id.lvIMP);
		lvMaqUsada = (ListView) findViewById(R.id.lvMaqUsada);
		btnRegFinTraza = (Button) findViewById(R.id.btnRegFinTraza);
		manejadorMensajes = new handlerAlertMessage();
		manejador = new ManejadorCampos();
		activity = this;

	}

	@SuppressWarnings("deprecation")
	public void FechaElabora(View v) {
		final Calendar c = Calendar.getInstance();
		fAno = c.get(Calendar.YEAR);
		fMes = c.get(Calendar.MONTH);
		fDia = c.get(Calendar.DAY_OF_MONTH);
		showDialog(DATE_DIALOG_ID2);
	}

	@SuppressWarnings("deprecation")
	public void FechaVenc(View v) {
		final Calendar c = Calendar.getInstance();
		fAno = c.get(Calendar.YEAR);
		fMes = c.get(Calendar.MONTH);
		fDia = c.get(Calendar.DAY_OF_MONTH);
		showDialog(DATE_DIALOG_ID1);
	}

	private DatePickerDialog.OnDateSetListener showdate1 = new DatePickerDialog.OnDateSetListener() {

		@SuppressLint("SimpleDateFormat")
		@Override
		public void onDateSet(DatePicker view, int year, int monthOfYear,
				int dayOfMonth) {
			fAno = year;
			fMes = monthOfYear + 1;
			fDia = dayOfMonth;

			Context context = getApplicationContext();
			CharSequence text = new StringBuilder().append(fDia).append("-")
					.append(fMes).append("-").append(fAno);
			int duration = Toast.LENGTH_SHORT;

			Toast toast = Toast.makeText(context, text, duration);
			toast.show();

			dateVenc = (fDia + "-" + fMes + "-" + fAno + "-").toString();

			// fecha de vencimiento
			self.setFechaVenc(dateVenc);

		}
	};

	private DatePickerDialog.OnDateSetListener showdate2 = new DatePickerDialog.OnDateSetListener() {

		@SuppressLint("SimpleDateFormat")
		@Override
		public void onDateSet(DatePicker view, int year, int monthOfYear,
				int dayOfMonth) {
			fAno = year;
			fMes = monthOfYear + 1;
			fDia = dayOfMonth;

			Context context = getApplicationContext();
			CharSequence text = new StringBuilder().append(fDia).append("-")
					.append(fMes).append("-").append(fAno);
			int duration = Toast.LENGTH_SHORT;

			Toast toast = Toast.makeText(context, text, duration);
			toast.show();

			dateElabora = (fDia + "-" + fMes + "-" + fAno + "-").toString();

			// fecha de elaboracion de proceso
			setFechaElabora(dateElabora);

		}
	};

	/* onStart */
	@Override
	protected void onStart() {
		super.onStart();

		Bundle bundle = new Bundle();
		bundle = getIntent().getBundleExtra("clave");

		if (bundle != null) {
			this.setFechaElabora(bundle.getString("dateElabora"));
			this.setFechaVenc(bundle.getString("dateVenc"));
			this.etTempFinalProceso.setText(bundle.getString("temp_fin"));
			this.etObsTraza.setText(bundle.getString("obs"));

			this.setTipo(Integer.parseInt(bundle.getString("numLote")));

			Log.i("Trazabilidad", "bundle  no es nulo");
		} else {
			Log.e("Trazabilidad", "bundle es nulo");
		}
	}

	/* onResume */
	@Override
	public void onResume() {
		super.onResume();

		handlerDb db = new handlerDb(this);
		db.abrir();
		if (db.leerTabla4("actividad").equals("new")) {
			this.setTitle(this.getString(R.string.title_activity_trazabilidad)
					+ ". (" + this.getString(R.string.msjDatosProcesoNumLote)
					+ ": " + db.leer("nombre_lote") + ", "
					+ this.getString(R.string.msjDatosProcesoProducto) + ": "
					+ db.leer("nombre_producto") + ")");

		} else {
			this.setTitle(this.getString(R.string.title_activity_trazabilidad)
					+ ". (" + this.getString(R.string.msjDatosProcesoNumLote)
					+ ": " + db.leerTabla2("nombre_lote") + ", "
					+ this.getString(R.string.msjDatosProcesoProducto) + ": "
					+ db.leerTabla2("nombre_producto") + ")");
		}
		db.cerrar();

		Log.i("Trazabilidad", "IN ON-RESUME");

		GetIpAddress direccion = new GetIpAddress(this);

		URL_IMP = direccion.getDireccion() + "/registros_imp_lotes.json";
		URL_MAQUINAS = direccion.getDireccion() + "/maquinas.json";
		URL_CONTROLES_FRUVER = direccion.getDireccion()
				+ "/manejo_fruver_lote.json";
		URL_REGISTRO_MAQUINAS_PROCESO = direccion.getDireccion()
				+ "/maquinas_procesos.json";
		handlerdb.abrir();
		if (handlerdb.leerTabla4("actividad").equals("new")) {
			idRegistro = handlerdb.leer("id_proceso");
			nombreLote = handlerdb.leer("nombre_lote");
			URL_FIN_PROCESO = direccion.getDireccion() + "/procesos/"
					+ idRegistro + ".json";

		} else {
			idRegistro = handlerdb.leerTabla2("id_proceso");
			nombreLote = handlerdb.leerTabla2("nombre_lote");
			URL_FIN_PROCESO = direccion.getDireccion() + "/procesos/"
					+ idRegistro + ".json";

		}

		final ProgressDialog pd = ProgressDialog.show(this, null,
				this.getString(R.string.PbMsjCargando), true, true);
		handlerdb.abrir();

		if (direccion.getDireccion() != null) {

			new Thread(new Runnable() {
				@Override
				public void run() {
					Log.i("Trazabilidad", "comienza a cargar las maquinas");
					self.spMaquinas(URL_MAQUINAS);
					Log.i("Trazabilidad", "teermina de cargar las maquinas");
				}
			}).start();

			new Thread(new Runnable() {
				@Override
				public void run() {
					Log.i("Trazabilidad", "comienza a cargar IMP");
					self.cargarIngredientes(URL_IMP, URL_CONTROLES_FRUVER);
					Log.i("Trazabilidad", "teermina de cargar IMP");

					pd.dismiss();

				}
			}).start();
		} else {
			new AlertDialog.Builder(this)
					.setIcon(android.R.drawable.ic_dialog_alert)
					.setTitle(R.string.tituloAlerta)
					.setMessage(R.string.msjErSinDireccion)
					.setPositiveButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {// un
								// listener que al pulsar, cierre la
								// aplicacion
								@Override
								public void onClick(DialogInterface dialog,
										int which) {
									// Salir
									Intent intent = new Intent();
									intent.setClass(activity, Etapas.class);
									startActivity(intent);
								}
							}).show();
		}
		btnRegFinTraza.setEnabled(true);

	}

	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case DATE_DIALOG_ID1:
			return new DatePickerDialog(this, showdate1, fAno, fMes, fDia);

		case DATE_DIALOG_ID2:
			return new DatePickerDialog(this, showdate2, fAno, fMes, fDia);
		}

		return null;
	}

	public void cargarIngredientes(String urlImp, String urlCtrlFv) {
		HttpClient httpClient = new DefaultHttpClient();
		HttpPost postIMP = new HttpPost(urlImp);
		HttpPost postCtrlFV = new HttpPost(urlCtrlFv);
		this.setLista_MpInspec(new ArrayList<IngredientesProducto>());

		handlerdb.abrir();
		String procesoNew = handlerdb.leer("id_proceso");
		String procesoOld = handlerdb.leerTabla2("id_proceso");

		// try para traer la materia prima inspaccionada en un json
		try {
			JSONObject dato = new JSONObject();
			if (handlerdb.leerTabla4("actividad").equals("new")) {
				dato.put("proceso_id", procesoNew);

			} else {

				dato.put("proceso_id", procesoOld);
			}

			StringEntity entity = new StringEntity(dato.toString());
			postIMP.setHeader("Content-Type",
					"application/json; chartset=UTF-8");
			postIMP.setEntity(entity);
			HttpResponse resp = httpClient.execute(postIMP);
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					resp.getEntity().getContent(), "UTF-8"));
			String json = reader.readLine();
			JSONTokener tokener = new JSONTokener(json);
			JSONArray finalResult = new JSONArray(tokener);
			JsonArrayIMP = finalResult;
			Log.w("Trazabilidad", finalResult.toString());
		} catch (Exception e) {

			Log.e("Trazabilidad",
					"Genero Error al momento de consultar El id del proceso para traer la informacion relacionada a elError: "
							+ e.fillInStackTrace().toString());
			/*
			 * hilo que muestra el mensaje de error de conexion al cargar los
			 * datos
			 */
			runOnUiThread(new Runnable() {
				public void run() {

					AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
							activity);
					mensajeEmergente.setTitle(R.string.tituloError);
					mensajeEmergente.setMessage(R.string.msjERcargarIMP);
					mensajeEmergente.setNeutralButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {
									Trazabilidad.this.finish();

								}
							});

					mensajeEmergente.create();
					mensajeEmergente.show();
				}
			});
		}

		// try para traer el control fruver
		try {
			JSONObject datoCtrlFV = new JSONObject();
			if (handlerdb.leerTabla4("actividad").equals("new")) {
				datoCtrlFV.put("proceso_id", procesoNew);

			} else {

				datoCtrlFV.put("proceso_id", procesoOld);
			}

			StringEntity entity = new StringEntity(datoCtrlFV.toString());
			postCtrlFV.setHeader("Content-Type",
					"application/json; chartset=UTF-8");
			postCtrlFV.setEntity(entity);
			HttpResponse resp = httpClient.execute(postCtrlFV);
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					resp.getEntity().getContent(), "UTF-8"));
			String json = reader.readLine();
			JSONTokener tokener = new JSONTokener(json);
			JSONArray finalResult = new JSONArray(tokener);
			JsonArrayCtrlFV = finalResult;
			Log.w("Trazabilidad", finalResult.toString());
		} catch (Exception e) {

			Log.e("Trazabilidad",
					"no carga la mPInspeccionada ni tampoco la controlada para llenar la lista de trzabilidad Error: "
							+ e.fillInStackTrace().toString());
			/*
			 * hilo que muestra el mensaje de error de conexion al cargar los
			 * datos
			 */
			runOnUiThread(new Runnable() {
				public void run() {

					AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
							activity);
					mensajeEmergente.setTitle(R.string.tituloError);
					mensajeEmergente.setMessage(R.string.msjERcargarIMP);
					mensajeEmergente.setNeutralButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {
									Trazabilidad.this.finish();

								}
							});

					mensajeEmergente.create();
					mensajeEmergente.show();
				}
			});
		}
		handlerdb.cerrar();
		JSONObject objet = new JSONObject();
		matrizIMP = new String[JsonArrayIMP.length()][6];

		try {
			for (int i = 0; i <= JsonArrayIMP.length() - 1; i++) {
				objet = JsonArrayIMP.getJSONObject(i);
				matrizIMP[i][0] = objet.getString("nombre_materia");
				matrizIMP[i][1] = objet.getString("cantidad_mp");
				matrizIMP[i][3] = objet.getString("fecha_vencimiento_pt");
				matrizIMP[i][4] = objet.getString("lote_proveedor");
				matrizIMP[i][5] = objet.getString("id");
			}
			for (int i = 0; i <= JsonArrayCtrlFV.length() - 1; i++) {
				objet = JsonArrayCtrlFV.getJSONObject(i);
				for (int j = 0; j < matrizIMP.length; j++) {
					if (matrizIMP[j][5].equals(objet
							.getString("registro_imp_id"))) {

						matrizIMP[j][2] = objet.getString("pulpa");
					}

				}

			}
			for (int i = 0; i < matrizIMP.length; i++) {
				if (!self.matrizIMP[i][5].equals(null)) {
					this.Lista_MpInspec.add(new IngredientesProducto(
							matrizIMP[i][0], matrizIMP[i][1], matrizIMP[i][2],
							matrizIMP[i][3], matrizIMP[i][4]));
				}
			}
		} catch (Exception e) {

			Log.e("Trazabilidad",
					"no carga la mPInspeccionada ni tampoco la controlada para llenar la lista de trzabilidad Error: "
							+ e.fillInStackTrace().toString());
			/*
			 * hilo que muestra el mensaje de error de conexion al cargar los
			 * datos
			 */
			runOnUiThread(new Runnable() {
				public void run() {

					AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
							activity);
					mensajeEmergente.setTitle(R.string.tituloError);
					mensajeEmergente.setMessage(R.string.msjERcargarIMP);
					mensajeEmergente.setNeutralButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {
									Trazabilidad.this.finish();

								}
							});

					mensajeEmergente.create();
					mensajeEmergente.show();
				}
			});
		}

		// correr en un nuevo hilo la UI
		runOnUiThread(new Runnable() {
			@Override
			public void run() {
				if (self.Lista_MpInspec.isEmpty()) {
					tvVacio.setText(R.string.msjSinMpInspec);
					Log.w("CtrlManejoFruver",
							"no hay materia prima inspeccionada");
				} else {

					for (int i = 0; i < Lista_MpInspec.size(); i++) {
						Log.i("CtrlManejoFruver", Lista_MpInspec.get(i).getMp()
								+ " " + Lista_MpInspec.get(i).getCantidad()
								+ " " + Lista_MpInspec.get(i).getPulpa() + " "
								+ Lista_MpInspec.get(i).getFechaV() + " "
								+ Lista_MpInspec.get(i).getLote());
					}
					self.adaptador = new AdaptadorIngredientesProducto(self,
							self.Lista_MpInspec);
					lvIMP.setAdapter(adaptador);
					lvIMP.setDividerHeight(1);
					Log.i("CtrlManejoFruver",
							"listó la materia prima inspeccionada");
				}
			}
		});

	}

	/* lista de maquinas */
	public void spMaquinas(String url) {

		listMaquinas = new ArrayList<Maquinas>();
		adaptadorMaq = new AdaptadorListaMaquinas(self, listMaquinas);
		try {
			Log.i("Trazabilidad", "entra al Try de cargar listas maquinas");
			JSONArray maquinas = JsonHelper.getJsonArrayFromUrl(url);
			for (int i = 0; i < maquinas.length(); i++) {
				JSONObject c = maquinas.getJSONObject(i);
				String nombremaquina = c.getString("nombre");
				String idmaquina = c.getString("id");
				listMaquinas.add(new Maquinas(nombremaquina, false, idmaquina));
			}

			runOnUiThread(new Runnable() {
				@Override
				public void run() {
					Log.e("Trazabilidad", "Entra a mostrar las Listas maquinas");
					lvMaqUsada.setAdapter(adaptadorMaq);
					lvMaqUsada.setDividerHeight(1);

				}
			});

		} catch (Exception e) {

			Log.e("Trazabilidad", "Entra al Catch de cargar Listas maquinas");

			/*
			 * hilo que muestra el mensaje de error de conexion al cargar los
			 * datos
			 */
			runOnUiThread(new Runnable() {
				public void run() {

					AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
							activity);
					mensajeEmergente.setTitle(R.string.tituloError);
					mensajeEmergente
							.setMessage(R.string.msjERIMPsinCargarMaquinas);
					mensajeEmergente.setNeutralButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {
									Trazabilidad.this.finish();

								}
							});

					mensajeEmergente.create();
					mensajeEmergente.show();
				}
			});
		}

		lvMaqUsada.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long arg3) {

				if (listMaquinas.get(position).isChequeoMaquina()) {
					listMaquinas.get(position).setChequeoMaquina(false);
				} else {
					listMaquinas.get(position).setChequeoMaquina(true);

				}

				adaptadorMaq.notifyDataSetChanged();
			}

		});

	}

	/* metodo que valida que la temperatura final no esté vacía */
	public void finTraza(View v) {
		int tempFin = manejador.validarPh(etTempFinalProceso);

		if (tempFin != 0) {
			switch (tempFin) {
			case 17:
				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloAlerta, R.string.msjTempFin,
						R.string.btnAceptar);
				break;
			}
		} else {

			validar();

		}
	}

	/* Metodo que realiza las validaciones de los campos y variables */
	public void validar() {
		int verificMaq = 0;
		if (this.getFechaElabora() != null) {
			if (this.getFechaVenc() != null) {
				handlerdb.abrir();
				if (handlerdb.leerTabla5("chequeo").equals("true")) {
					if (handlerdb.leerTabla6("chequeo").equals("true")) {
						for (int i = 0; i < listMaquinas.size(); i++) {
							if (listMaquinas.get(i).isChequeoMaquina()) {
								verificMaq++;
							}

						}

						if (verificMaq != 0) {
							if (!this.etObsTraza.getText().equals("")) {
								String ObsTraza = this.etObsTraza.getText()
										.toString();
								ObsTraza = this.validarcampos
										.DeleteAccents(ObsTraza);
								this.setObs(ObsTraza);

							}

							this.setTempFinal(Double
									.parseDouble(this.etTempFinalProceso
											.getText().toString()));

							progressDialog = new ProgressDialog(self);
							progressDialog
									.setMessage(self
											.getString(R.string.PbMsjFinalizandoProceso));
							progressDialog.setCancelable(true);
							progressDialog.show();

							new Thread(new Runnable() {
								@Override
								public void run() {
									self.registrarMaqUsadas();
								}
							}).start();

						} else {
							// debe seleccionar alguna maquina de mezclado
							manejadorMensajes.alertMessageOneButton(activity,
									R.string.tituloAlerta,
									R.string.msjERFaltaSelectMaq,
									R.string.btnAceptar);
						}

					} else {
						// no se ha hecho ningun registro de producto empacado
						manejadorMensajes.alertMessageOneButton(activity,
								R.string.tituloAlerta,
								R.string.msjERFaltaRegistroPT,
								R.string.btnAceptar);
					}

				} else {
					// hace falta CheqFQ
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloAlerta,
							R.string.msjERFaltaRegCheckFQTraza,
							R.string.btnAceptar);
				}
				handlerdb.cerrar();

			} else {
				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloAlerta, R.string.msjFechaVenc,
						R.string.btnAceptar);
			}
		} else {
			manejadorMensajes.alertMessageOneButton(activity,
					R.string.tituloAlerta, R.string.msjFechaElabora,
					R.string.btnAceptar);
		}
	}

	public void registrarMaqUsadas() {

		HttpClient httpClient = new DefaultHttpClient();
		HttpPost post = new HttpPost(URL_REGISTRO_MAQUINAS_PROCESO);
		JSONObject datoPsot = new JSONObject();
		try {
			for (int i = 0; i < listMaquinas.size(); i++) {
				if (listMaquinas.get(i).isChequeoMaquina()) {

					datoPsot.put("maquina_id", listMaquinas.get(i)
							.getIdMaquina());
					datoPsot.put("proceso_id", idRegistro);
					StringEntity entity1 = new StringEntity(datoPsot.toString());
					post.setHeader("Content-Type",
							"application/json; chartset=UTF-8");
					post.setEntity(entity1);
					httpClient.execute(post);
				}
			}

			new Thread(new Runnable() {
				@Override
				public void run() {
					self.enviarDatos();
				}
			}).start();

		} catch (Exception e) {

			Log.e("Trazabilidad",
					"Error en el registro de maquinas usadas, Error: "
							+ e.fillInStackTrace().toString());
			progressDialog.dismiss();
			new AlertDialog.Builder(self)
					.setIcon(android.R.drawable.ic_dialog_alert)
					.setTitle(R.string.tituloError)
					.setMessage(R.string.msjErMaq_procesos)

					.setPositiveButton(R.string.btnAceptar, null).show();
		}

	}

	/* Metodo que genera el registro de finalizacion de Proceso */
	public void enviarDatos() {
		this.EstadoFinalProceso = "finalizado";
		HttpClient httpClient = new DefaultHttpClient();
		HttpPut put = new HttpPut(URL_FIN_PROCESO);
		JSONObject dato = new JSONObject();

		try {

			dato.put("estado", EstadoFinalProceso);
			dato.put("fecha_elaboracion", this.getFechaElabora());
			dato.put("fecha_vencimiento_pt", this.getFechaVenc());
			dato.put("temp_fin", this.getTempFinal());
			dato.put("obs", this.getObs());
			StringEntity entity1 = new StringEntity(dato.toString());
			put.setHeader("Content-Type", "application/json; chartset=UTF-8");
			put.setEntity(entity1);
			httpClient.execute(put);
			runOnUiThread(new Runnable() {
				public void run() {

					btnRegFinTraza.setEnabled(false);
					progressDialog.dismiss();
					new AlertDialog.Builder(self)
							.setIcon(android.R.drawable.checkbox_on_background)
							.setTitle(R.string.msjMuyBien)
							.setMessage(
									self.getString(R.string.msjTerminaProceso1)
											+ ": "
											+ nombreLote
											+ " "
											+ self.getString(R.string.msjTerminaProceso2))

							.setPositiveButton(R.string.btnAceptar,
									new DialogInterface.OnClickListener() {// un
										// listener que al pulsar, cierre la
										// aplicacion
										@Override
										public void onClick(
												DialogInterface dialog,
												int which) {
											// Salir
											Intent i = new Intent();
											i.setClass(activity, Etapas.class);
											self.startActivity(i);
										}
									}).show();

				}
			});

		} catch (Exception e) {
			Log.e("Trazabilidad", e.fillInStackTrace().toString());
			progressDialog.dismiss();
			runOnUiThread(new Runnable() {
				public void run() {
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloError, R.string.msjERConexionEnviar,
							R.string.btnAceptar);

				}
			});
		}

	}

	/* ir a chequeo fisico-quimico */
	public void goCheqFQ_Traza(View view) {
		Intent intent = new Intent();
		intent.setClass(this, CheqFQ_Traza.class);
		Bundle outState = new Bundle();

		outState.putString("dateElabora", dateElabora);
		outState.putString("dateVenc", dateVenc);
		outState.putString("temp_fin", this.etTempFinalProceso.getText()
				.toString());
		outState.putString("obs", this.etObsTraza.getText().toString());
		intent.putExtra("estado", outState);
		startActivity(intent);
	}

	/* ir a producto empacado */
	public void goProductoEmpacado(View view) {
		Intent intent = new Intent();
		intent.setClass(this, ProductoEmpacado.class);
		Bundle outState = new Bundle();

		outState.putString("dateElabora", dateElabora);
		outState.putString("dateVenc", dateVenc);
		outState.putString("temp_fin", this.etTempFinalProceso.getText()
				.toString());
		outState.putString("obs", this.etObsTraza.getText().toString());
		intent.putExtra("estado", outState);
		startActivity(intent);
	}

	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {

		if (keyCode == KeyEvent.KEYCODE_BACK) {

			// Salir
			Intent intent = new Intent();
			intent.setClass(activity, CtrlManejoFruver.class);
			startActivity(intent);
			return true;

		}
		// para las demas cosas, se reenvia el evento al listener habitual
		return super.onKeyUp(keyCode, event);
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);

		outState.putString("dateElabora", dateElabora);
		outState.putString("dateVenc", dateVenc);
		outState.putString("temp_fin", this.etTempFinalProceso.getText()
				.toString());
		outState.putString("obs", this.etObsTraza.getText().toString());

	}

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);

		this.setFechaElabora(savedInstanceState.getString("dateElabora"));
		this.setFechaVenc(savedInstanceState.getString("dateVenc"));
		this.etTempFinalProceso.setText(savedInstanceState
				.getString("temp_fin"));
		this.etObsTraza.setText(savedInstanceState.getString("obs"));

	}

}
